package edu.hubu.supermarketmanagementsystem.service.impl;

import edu.hubu.supermarketmanagementsystem.mapper.AdminMapper;
import edu.hubu.supermarketmanagementsystem.service.AdminService;
import edu.hubu.supermarketmanagementsystem.vo.ResultVO;
import org.springframework.beans.factory.annotation.Autowired;
import edu.hubu.supermarketmanagementsystem.entity.Admin;
import org.springframework.stereotype.Service;
import cn.hutool.crypto.digest.DigestUtil;


@Service
public class AdminServiceImpl implements AdminService {

    @Autowired
    private AdminMapper adminMapper;

    @Override
    public ResultVO<String> checkUsername(String username){
        //1.调用AdminMapper中的 selectByUsername 方法 根据username参数查询用户信息
        Admin admin =  adminMapper.selectByUsername(username);

        //2.判断查询结果、封装验证结果
        if(admin != null){
            return new ResultVO<>(500, "账号不可用", username);
        }
        else{
            return new ResultVO<>(200, "账号可用", username);
        }
    }

    /**
     * 用于注册用户。
     *
     * @param username  用于注册的用户名。
     * @param password  用于注册的密码。
     * @param name      用户的姓名。
     * @param telephone 用户的电话号码。
     * @param role      用户的角色。
     * @return 带有信息的<code>ResultVO</code>对象。
     */
    @Override
    public ResultVO<String> register(String username, String password, String name, String telephone, String role) {

            // 将用户信息封装到 Java Bean 中，其中，密码使用 SHA256 散列。
            Admin admin = new Admin();
            admin.setAdminUsername(username);
            admin.setAdminPassword(DigestUtil.sha256Hex(password));
            admin.setAdminName(name);
            admin.setAdminTelenumber(telephone);
            admin.setRole(role);

            if (adminMapper.register(admin) == 1) {
                return new ResultVO<>(200, "注册成功", username);
            } else {
                return new ResultVO<>(500, "注册失败", username);
            }
    }

    /**
     * 用于用户登录。
     *
     * @param username 输入的用户名。
     * @param password 输入的密码。
     * @return 所查询到的用户的ID。
     */
    @Override
    public ResultVO<Admin> login(String username, String password) {
        Admin result = adminMapper.login(username, DigestUtil.sha256Hex(password));
        if (result != null) {
            return new ResultVO<>(200, "登录成功。", result);
        }
        else {
            return new ResultVO<>(500, "登录失败：密码错误或用户不存在。", new Admin());
        }
    }

    /**
     * 获取当前所有用户的基本信息。
     *
     * @return 带有所有用户基本信息的上下文实体。
     */
    @Override
    public ResultVO<Admin[]> getUserList() {
        Admin[] admins = adminMapper.getUserList();
        if (admins != null) {
            return new ResultVO<>(200, "获取用户列表成功。", admins);
        }
        else {
            return new ResultVO<>(500, "不存在用户。", null);
        }
    }

    /**
     * 更改用户的基本信息。
     *
     * @param id           待更改信息的用户ID。
     * @param newUsername  新用户名。
     * @param newName      新姓名。
     * @param newTelephone 新电话号码。
     * @param newRole      新角色。
     * @return 如果成功则返回真，失败返回假。
     */
    @Override
    public ResultVO<Boolean> updateUser(Integer id, String newUsername, String newName, String newTelephone, String newRole) {
        // 将用户信息封装到 Java Bean 中。
        Admin admin = new Admin();
        admin.setAdminId(id);
        admin.setAdminUsername(newUsername);
        admin.setAdminName(newName);
        admin.setAdminTelenumber(newTelephone);
        admin.setRole(newRole);

        if(adminMapper.updateUser(admin) == 1){
            return new ResultVO<>(200, "更新成功。", true);
        }
        else {
            return new ResultVO<>(500, "更新失败", false);
        }
    }

    /**
     * 更改用户密码。
     *
     * @param id          待更改密码的用户ID。
     * @param newPassword 新密码。
     * @return 如果成功则返回真，失败返回假。
     */
    @Override
    public ResultVO<Boolean> updatePassword(Integer id, String newPassword) {
        if(adminMapper.updateUserPassword(id, DigestUtil.sha256Hex(newPassword)) == 1){
            return new ResultVO<>(200, "更新成功。", true);
        }
        else {
            return new ResultVO<>(500, "更新失败", false);
        }
    }

    /**
     * 删除用户。
     *
     * @param id 待删除用户的ID。
     * @return 如果成功则返回真，失败返回假。
     */
    @Override
    public ResultVO<Boolean> deleteUser(Integer id) {
        if (adminMapper.deleteUser(id) == 1) {
            return new ResultVO<>(200, "删除成功。", true);
        }
        else {
            return new ResultVO<>(500, "删除失败", false);
        }
    }

    /**
     * 根据ID查找用户。
     *
     * @param id 待查找的用户ID。
     * @return 如果成功则返回此用户，失败返回null。
     */
    @Override
    public ResultVO<Admin> getUserById(Integer id) {
        Admin admin = adminMapper.getUserById(id);
        if (admin != null) {
            return ResultVO.success(admin);
        }
        else {
            return ResultVO.error(500, "没有与搜索条件符合的项。");
        }
    }
}
